package QianFeng09.ThreadDemo;
/**
 * 守护线程（daemon）与yield：
 * public final void setDaemon(boolean on)
 * 将此线程标记为daemon线程或用户线程。当运行的唯一线程都是守护进程线程时，Java虚拟机将退出。
 * public final boolean isDaemon()
 * 测试这个线程是否是守护线程。
 * public static void yield()
 * 暂停当前正在执行的线程对象，并执行其他线程。(了解)
 *
 * 其他方法与优先级：
 * long getId()                          返回该线程的标识符。
 * String getName()                      返回该线程的名称。
 * void setName(String name)             改变线程名称，使之与参数name相同。
 * boolean isAlive()                     测试线程是否处于活动状态。
 * void setPriority(int newPriority)     更改线程的优先级。
 * static int MAX_ PRIORITY              线程可以具有的最高优先级。
 * static int MIN_ PRIORITY              线程可以具有的最低优先级。
 * static int NORM_ PRIORITY             分配给线程的默认优先级。
 **/
public class ThreadDemo3 {

    public static void main(String[] args) {
        MyRunnable4 myRunnable4 = new MyRunnable4();
        Thread thread = new Thread(myRunnable4);
        thread.setName("thread-4");//设置线程的名字
        //优先级高可以提高该线程抢到CUP时间片概率大  不代表CUP时间片全占了
        thread.setPriority(Thread.MAX_PRIORITY);//线程可以具有的最高优先级
        //线程可以分为守护线程和用户线程，当进程中没有用户线程时，JVM会退出
        thread.setDaemon(true);//把线程设置为守护线程
        thread.start();
        System.out.println(thread.getId());//返回该线程的标识符。
        System.out.println(thread.isAlive());//测试线程是否处于活动状态


        //用户线程快速执行完毕后，守护线程就不会执行了，因为JVM已经退出了
        for (int i = 0; i < 50; i++) {
            System.out.println("main--" + i);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (i % 2 == 0) {
                Thread.yield();//用户线程在i为偶数时让出本次CUP时间片段
            }
        }
    }
}

class MyRunnable4 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            System.out.println("--" + i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
